#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <unistd.h>
#include <cstdlib>
#include <pthread.h> //原生线程库的头文件

using namespace std;

//用全局变量测试线程之间的资源共享，与多进程不同。
int g_val = 100;

//将指定的整型数据转换成十六进制的算法
string ToHex(pthread_t tid)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%lx", tid);
    return id;
}

void *threadrun(void *args)
{
    string threadname = (char*)args;
    while (true)
    {
        //使用全局变量测试正文代码块中的线程资源共享——发现全局变量的值及地址与主线程输出的一样
        printf("new thread, g_val: %d, &g_val: %p\n", g_val, &g_val);
        cout << threadname << " is running" << endl;
        cout << "new thread pid: " << getpid() << endl;
        cout << "mythread id: " << ToHex(pthread_self()) << endl;
        cout << "g_val: "<< g_val << "  &g_val: " << &g_val << endl;
        g_val++;
        sleep(1);
    }
    cout << endl;
    //void在C/C++方面是不允许定义变量，但void*指针允许
    //这里返回一个void*类型的指针
    return (void*)123;
}

int main()
{
    pthread_t tid;
    //指定线程执行函数threadrun的参数——thread-1
    pthread_create(&tid, nullptr, threadrun, (void*)"thread-1");
    //新线程运行其2秒后取消（注意：新线程和主线程具体谁先运行由调度器决定）
    sleep(2);
    pthread_cancel(tid);

    int cnt = 3;
    while (cnt)
    {
        //使用全局变量测试正文代码块中的线程资源共享——发现全局变量的值及地址与新建线程输出的一样
        printf("main thread, g_val: %d, &g_val: %p\n", g_val, &g_val);
        cout << "main thread is running: cnt = " << cnt << endl;
        cout << "pid: " << getpid() << " new thread id: " << ToHex(tid) << endl;
        cout << "main thread id: " << ToHex(pthread_self()) << endl;
        cout << "g_val: "<< g_val << " &g_val: " << &g_val << endl;
        cout << endl;
        sleep(1);
        cnt--;
    }
    cout << endl;

    //等待回收资源并输出线程返回值
    void* ret = nullptr;
    int n = pthread_join(tid, &ret); 
    cout << "main thread quit, n(pthread_join) = " << n << endl;
    cout << "main thread get a ret: " << (long long)ret << endl;
    cout << endl;
    return 0;
}







// #include <iostream>
// #include <pthread.h>
// using namespace std;

// int result = 10;  

// void* thread_function(void* arg)
// {    
//     //result是线程的返回结果
//     //注意：不能使用局部变量，因为函数执行完毕时，这个局部变量（及其存储的内存）通常会被释放或回收，此时输出的返回值是一个随机值
//     pthread_exit((void*)&result);
// }

// int main()
// {  
//     pthread_t thread;  
//     void* ret = nullptr;  
//     pthread_create(&thread, NULL, thread_function, NULL);  
//     //获取线程的返回值——类型void*
//     pthread_join(thread, &ret);
//     //注意，这里需要强制转换为指定的类型
//     cout << "Thread returned: " << *(int*)ret << endl;  
//     return 0;  
// }


// #include <iostream>
// #include <pthread.h>  
// #include <unistd.h>
// using namespace std;

// void* thread(void* arg) 
// {  
//     while (1) 
//     {  
//         cout << "new thread is running: ID = " << pthread_self() << endl; 
//         sleep(1);
//     }  
//     return NULL;  
// }  

// int main()
// {  
//     pthread_t threadid;  
//     pthread_create(&threadid, NULL, thread, NULL);  
//     //让线程运行一段时间后再取消 
//     sleep(3);
//     pthread_cancel(threadid);  
//     //等待线程终止，回收其资源 
//     pthread_join(threadid, NULL);  
//     cout << "Thread has been canceled" << endl;  
//     return 0;  
// }


